'''
Company: TWL
Author: xue jian
Email: xuejian@kanzhun.com
Date: 2020-08-09 17:53:05
'''
'''
5485. 找出最长的超赞子字符串
给你一个字符串 s 。请返回 s 中最长的 超赞子字符串 的长度。

「超赞子字符串」需满足满足下述两个条件：

该字符串是 s 的一个非空子字符串
进行任意次数的字符交换重新排序后，该字符串可以变成一个回文字符串
 

示例 1：

输入：s = "3242415"
输出：5
解释："24241" 是最长的超赞子字符串，交换其中的字符后，可以得到回文 "24142"
示例 2：

输入：s = "12345678"
输出：1
示例 3：

输入：s = "213123"
输出：6
解释："213123" 是最长的超赞子字符串，交换其中的字符后，可以得到回文 "231132"
示例 4：

输入：s = "00"
输出：2
 

提示：

1 <= s.length <= 10^5
s 仅由数字组成


tips:代码很简单，思路就是采用十位的二进制记录状态。因为只用关心奇数偶数状态就行，而奇数偶数状态的转换和异或的运算一直。
这样就只需要扫描一次字符串就可以了。
记录最长子字符的时候，需要有个哈希表来记录状态。当状态status之前出现过，那么之前的脚标index与现在的脚标i之间的就是所有字符都出现偶数次的。
凑成超赞子字符串，还有一种情况是只有一个数字的状态是奇的，其他都是偶的。即可以用现在的status遍历0~9，凑成new_status，如果之前new_status出现过并且脚标是index的话，那么index与i之间的字符串也是超赞字符串。

代码如下，解释半天，不如读一段代码来的简单

'''


class Solution:
    def longestAwesome(self, s: str) -> int:
        pre = {0:-1}
        status = 0
        re = 0
        for i, v in enumerate(s):
            status ^= (1<<int(v))
            if status not in pre:
                pre[status] = i
            else:
                re = max(re, i-pre[status])
            for k in range(10):
                new_status = status^(1<<k)
                if new_status in pre:
                    re = max(re, i-pre[new_status])
        return re
if __name__ == "__main__":
    solution = Solution()
    s = "3242415"
    print(solution.longestAwesome(s))